package cn.gogpay.dcb.ixc.cloud.common.util;



import cn.gogpay.dcb.ixc.cloud.common.interfaces.TreeNode;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @description: 树构造工厂
 * @author: YinHeng
 * @date: 2020/11/6 16:27
 **/
public class TreeBuildFactory<T extends TreeNode> implements Serializable {
    /**
     * 构建树(可能有多个根节点）
     *
     * @param nodeList
     * @return
     */
    public List<T> doTreeBuild(List<T> nodeList) {
        List<T> roots = getRootNodes(nodeList);
        roots.forEach(root -> {
            getChildren(nodeList, root);
        });
        return roots;
    }


    /**
     * 获取根节点(未考虑节点闭环情况,父节点=自己的算做根节点）
     *
     * @param allNode
     * @return
     */
    public List<T> getRootNodes(List<T> allNode) {
        List<T> roots = new ArrayList<>();
        //遍历所有节点
        allNode.forEach(t1 -> {
            boolean root = true;
            for (int i=0;i<allNode.size();i++){
                T t2 = allNode.get(i);
                //如果该节点存在父节点，则该节点不是根节点
                if (t1.getPid().equals(t2.getId())){
                    root=false;
                    break;
                }
            }
            if (root){
                roots.add(t1);
            }
        });
        return roots;
    }

    /**
     * 获取子节点（子节点=自己的未算作子节点）
     *
     * @param allNode
     * @param parent
     */
    public void getChildren(List<T> allNode, T parent) {
        if (parent.getId().equals(parent.getPid())) {
            return;
        }

        List<T> children = new ArrayList<>();
        allNode.forEach(item -> {
            if (item.getPid().equals(parent.getId())) {
                children.add(item);
                getChildren(allNode, item);
            }
        });
        parent.setChildren(children);
    }

}
